package main

import (
	"context"
	"fmt"
	"log"
	"time"

	smsapi "../"
)

func main() {
	// 示例1: 使用默认配置创建客户端
	fmt.Println("=== SMS API 示例程序 ===")

	// 创建配置
	config := &smsapi.Config{
		Service: smsapi.ServiceConfig{
			Name:    "SMS API Example",
			Version: "1.0.0",
			Port:    8080,
			Timeout: 30 * time.Second,
		},
		SpaceIoT: smsapi.SpaceIoTConfig{
			Enabled:   true,
			APIURL:    "https://sms.space-iot.net/api/sms/sendByContent",
			Signature: "your_signature",
			SecretKey: "your_secret_key",
			Timeout:   30 * time.Second,
		},
		Retry: smsapi.RetryConfig{
			MaxAttempts: 3,
			InitialDelay: time.Second,
			MaxDelay:     10 * time.Second,
			Multiplier:   2.0,
		},
		RateLimit: smsapi.RateLimitConfig{
			Enabled: true,
			RPS:     10,
			Burst:   20,
		},
	}

	// 创建SMS客户端
	client, err := smsapi.NewSMSClient(config)
	if err != nil {
		log.Fatalf("创建SMS客户端失败: %v", err)
	}
	defer client.Close()

	// 示例2: 健康检查
	fmt.Println("\n--- 健康检查 ---")
	health, err := client.HealthCheck(context.Background())
	if err != nil {
		log.Printf("健康检查失败: %v", err)
	} else {
		fmt.Printf("服务状态: %s\n", health.Status)
		fmt.Printf("版本: %s\n", health.Version)
		fmt.Printf("运行时间: %s\n", health.Uptime)
	}

	// 示例3: 发送简单短信
	fmt.Println("\n--- 发送简单短信 ---")
	resp, err := client.SendSimpleSMS(context.Background(), "13800138000", "这是一条测试短信")
	if err != nil {
		log.Printf("发送短信失败: %v", err)
	} else {
		fmt.Printf("短信发送成功: %+v\n", resp)
	}

	// 示例4: 发送验证码
	fmt.Println("\n--- 发送验证码 ---")
	code := "123456"
	resp, err = client.SendVerificationCode(context.Background(), "13800138000", code)
	if err != nil {
		log.Printf("发送验证码失败: %v", err)
	} else {
		fmt.Printf("验证码发送成功: %+v\n", resp)
	}

	// 示例5: 批量发送短信
	fmt.Println("\n--- 批量发送短信 ---")
	phones := []string{"13800138000", "13800138001", "13800138002"}
	batchResp, err := client.SendBatchSMSToPhones(context.Background(), phones, "批量测试短信")
	if err != nil {
		log.Printf("批量发送失败: %v", err)
	} else {
		fmt.Printf("批量发送结果: 成功 %d, 失败 %d\n", 
			batchResp.SuccessCount, batchResp.FailureCount)
		for _, result := range batchResp.Results {
			fmt.Printf("  手机号 %s: %s\n", result.Phone, result.Status)
		}
	}

	// 示例6: 查询短信状态
	if resp != nil && resp.MessageID != "" {
		fmt.Println("\n--- 查询短信状态 ---")
		queryResp, err := client.QuerySMS(context.Background(), &smsapi.QuerySMSRequest{
			MessageID: resp.MessageID,
		})
		if err != nil {
			log.Printf("查询短信状态失败: %v", err)
		} else {
			fmt.Printf("短信状态: %+v\n", queryResp)
		}
	}

	// 示例7: 获取指标
	fmt.Println("\n--- 获取指标 ---")
	metrics, err := client.GetMetrics(context.Background())
	if err != nil {
		log.Printf("获取指标失败: %v", err)
	} else {
		fmt.Printf("总发送数: %d\n", metrics.TotalSent)
		fmt.Printf("成功数: %d\n", metrics.SuccessCount)
		fmt.Printf("失败数: %d\n", metrics.FailureCount)
		fmt.Printf("成功率: %.2f%%\n", metrics.SuccessRate*100)
	}

	// 示例8: 工具函数演示
	fmt.Println("\n--- 工具函数演示 ---")
	
	// 手机号验证
	phones = []string{"13800138000", "1380013800", "invalid"}
	for _, phone := range phones {
		if smsapi.ValidatePhone(phone) {
			fmt.Printf("手机号 %s: 有效\n", phone)
		} else {
			fmt.Printf("手机号 %s: 无效\n", phone)
		}
	}

	// 内容验证
	content := "这是一条测试短信内容"
	if smsapi.ValidateContent(content) {
		fmt.Printf("短信内容有效: %s\n", content)
	}

	// 费用估算
	cost := smsapi.EstimateCost(content, smsapi.SMSTypeText)
	fmt.Printf("预估费用: %.4f 元\n", cost)

	fmt.Println("\n=== 示例程序结束 ===")
}